package org.example.day03;

import java.util.*;

/**
 * @author zlxad
 * @version 1.0
 * @description: TODO+
 * 提取字符串中的最长合法简单数学表达式，字符串长度最长的，并计算表达式的值。如果没有，则返回0 <br> 简单数学表达式只能包含以下内容 <br> 0-9数字，符号 +-* <br> 说明： <br> 1. 所有数字，计算结果都不超过long <br> <div>  2. 如果有多个长度一样的，请返回第一个表达式的结果 </div> <div>  3. 数学表达式，必须是最长的，合法的 </div> <div>  4. 操作符不能连续出现，如 +--+1 是不合法的 </div> <div>  <br> </div>
 *
 * 提取字符串中的最长合法简单数学表达式，字符串长度最长的，并计算表达式的值。如果没有，则返回0
 * 简单数学表达式只能包含以下内容 0-9数字，符号 +-*
 * 说明：
 * 1. 所有数字，计算结果都不超过long
 * 2. 如果有多个长度一样的，请返回第一个表达式的结果
 * 3. 数学表达式，必须是最长的，合法的
 * 4. 操作符不能连续出现，如 +--+1 是不合法的
 * @date 2024/3/11 15:22
 */
//本题通过率应该在70左右
public class test044 {

    // 评估并计算表达式的值
    public static long evaluate(String expression) {
        if (expression == null || expression.length() == 0) {
            return 0;
        }
        // 使用栈来处理表达式
        Stack<Long> stack = new Stack<>();
        long num = 0; // 当前数字
        char sign = '+'; // 当前符号，默认为加号
        char[] chars = (expression + "+").toCharArray(); // 在表达式末尾添加"+"，方便处理

        for (char c : chars) {
            if (Character.isDigit(c)) {
                // 如果是数字，计算当前数字的值
                num = num * 10 + c - '0';
            } else if ("+-*".indexOf(c) != -1) {
                // 如果是运算符，根据前一个符号计算结果
                if (sign == '+') {
                    stack.push(num);
                } else if (sign == '-') {
                    stack.push(-num);
                } else if (sign == '*') {
                    stack.push(stack.pop() * num); // 乘法直接与栈顶元素相乘
                }
                // 重置当前数字和更新当前符号
                num = 0;
                sign = c;
            }
        }
        // 计算栈中所有数字的和
        long result = 0;
        for (long i : stack) {
            result += i;
        }
        return result;
    }

    // 查找并返回最长的合法表达式的结果
    public static long findLongestValidExpression(String s) {
        int maxLen = 0;
        String maxExpr = "";
        Set<Character> validChars = new HashSet<>(Arrays.asList('+', '-', '*', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'));

        int start = 0;
        while (start < s.length()) {
            int end = start;
            while (end < s.length() && validChars.contains(s.charAt(end))) {
                end++;
            }
            while (end > start) {
                String temp = s.substring(start, end);
                if (temp.replaceAll("[^-]", "").length() < temp.length()) {
                    int length = end - start;
                    if (length > maxLen) {
                        maxLen = length;
                        maxExpr = temp;
                    }
                    break;
                }
                end--;
            }
            start++;
        }

        if (!maxExpr.isEmpty()) {
            return evaluate(maxExpr);
        }
        return 0;
    }

    // 主函数，用于读取输入和输出结果
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String inputStr = scanner.nextLine().trim();
        System.out.println(findLongestValidExpression(inputStr));
        scanner.close();
    }
}


